/****************************************************************************\
 * @file    BR_Common.h
 * @author  傅帅
 * @date    2019/12/25
 * @brief   BR_ServoCarTemplate基本功能通用头文件
 *
 ******************************************************************************
 * @attent
 ****************************************************************************/
#ifndef BR_COMMON_H
#define BR_COMMON_H

#include "stdint.h"
#include "BR_Config.h"
#include "BR_Stat.h"
#include "BR_Console.h"
#include "BR_Misc.h"
#include "BR_Usart.h"
#include "BR_Error.h"
#include "BR_Action.h"
#include "BR_Locator.h"
#include "BR_ServoMotor.h"
#include "BR_DrivingMotor.h"
#include "BR_PathFollowing.h"
#include "BR_ChassisMotion.h"
#include "BR_CenterController.h"
#include "BR_RemoteController.h"

#define ABS(x) (( x ) > 0 ? ( x ) : -( x ))
#define COMPOUND(a,b) sqrt(pow(a,2) + pow(b,2))
#define TRUE 1
#define FALSE 0
/* -------------------------------------------------- 数据结构部分 ----------------------------------------------- */

/* 控制状态枚举 */
typedef enum {
    MANUAL,
    AUTO,
    STOP,
}BR_eControlState_t;

/* 场地枚举 */
typedef enum {
    RED,
    BLUE,
    UNSURE
}BR_eField_t;

/* 状态标志结构体 */
typedef struct {
    BR_eControlState_t eControlMode;        // 控制模式, 自动or手动
    BR_eWorkingFlow_t eWorkingFlow;         // 当前处于工作流中的状态
    BR_eField_t eField;                     // 红蓝场指示位
    uint8_t LocationStatusFlag;             // 全场定位校准状态指示
}BR_StateFlag_t;

/* 底盘状态结构体 */
typedef struct {
    float X;        // [mm]
    float Y;        // [mm]
    float Theta;    // [rad]
    float Vel;      // [mm/s]
    float Omega;    // [rad]
}BR_ChassisState_t;

/* 机器人结构体 */
typedef struct
{
    BR_StateFlag_t StateFlags;                                      // 状态标志
    BR_ChassisState_t ChassisState;                                 // 底盘状态
    BR_ServoMotor_t ServoMotors;                                    // 舵向电机
    BR_DrivingMotor_t DrivingMotors;                                // 驱动电机
    BR_RemoteController_t RemoteController;                         // 遥控器结构体
    void ( *fMotionControl )(float Vel, float Dir, float Omega);    // 底盘整体运动控制
    void ( *fWheelsControl )(float *WheelsVel, float *WheelsDir);   // 各轮独立控制
}BR_Robot_t;

extern BR_Robot_t BR_gRobot;
#endif
